/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
package org.ebayopensource.turmeric.runtime.common.impl.attachment;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.activation.CommandInfo;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.util.ByteArrayDataSource;
import org.apache.axiom.attachments.CachedFileDataSource;
import com.ebay.kernel.util.URLDecoder;
/**
* InboundAttachmentDataHanlder is a wrapper of the inbound message's data handler for a given
* cid. It delegates all the DataHanlder calls to the inboundMeesageAttachments's data
* handler. It defers the creation of the real DataHandler
* until its method is accessed.
*
* @author wdeng
*/
public class InboundAttachmentDataHandler extends DataHandler implements java.awt.datatransfer.Transferable {
private InboundMessageAttachments m_context;
private DataHandler m_delegate;
private String m_cid;
private static DataSource createDummyDataSource() {
return new ByteArrayDataSource( "".getBytes(), "text/plain");
}
public InboundAttachmentDataHandler(String cid, InboundMessageAttachments context) {
// Really don't like this. But how can we workaround this constructor call?
super(createDummyDataSource());
m_context = context;
m_cid = URLDecoder.decode(cid);
}
private DataHandler getUnderlyingDataHandler() {
if (null != m_delegate) {
return m_delegate;
}
m_delegate = m_context.getUnderlyingDataHandler(m_cid);
if (m_delegate == null) {
throw new NullPointerException("DataHandler is null for cid: " + m_cid);
}
return m_delegate;
}
@Override
public CommandInfo[] getAllCommands() {
return getUnderlyingDataHandler().getAllCommands();
}
@Override
public Object getBean(CommandInfo arg0) {
return getUnderlyingDataHandler().getBean(arg0);
}
@Override
public CommandInfo getCommand(String arg0) {
return getUnderlyingDataHandler().getCommand(arg0);
}
@Override
public Object getContent() throws IOException {
return getUnderlyingDataHandler().getContent();
}
@Override
public String getContentType() {
return getUnderlyingDataHandler().getContentType();
}
@Override
public DataSource getDataSource() {
return getUnderlyingDataHandler().getDataSource();
}
@Override
public InputStream getInputStream() throws IOException {
return getUnderlyingDataHandler().getInputStream();
}
@Override
public String getName() {
return getUnderlyingDataHandler().getName();
}
@Override
public OutputStream getOutputStream() throws IOException {
return getUnderlyingDataHandler().getOutputStream();
}
@Override
public CommandInfo[] getPreferredCommands() {
return getUnderlyingDataHandler().getPreferredCommands();
}
@Override
public Object getTransferData(DataFlavor arg0) throws UnsupportedFlavorException, IOException {
return getUnderlyingDataHandler().getTransferData(arg0);
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return getUnderlyingDataHandler().getTransferDataFlavors();
}
@Override
public boolean isDataFlavorSupported(DataFlavor arg0) {
return getUnderlyingDataHandler().isDataFlavorSupported(arg0);
}
@Override
public void setCommandMap(CommandMap arg0) {
getUnderlyingDataHandler().setCommandMap(arg0);
}
@Override
public void writeTo(OutputStream arg0) throws IOException {
getUnderlyingDataHandler().writeTo(arg0);
}
@Override
protected void finalize () throws Throwable {
DataSource ds = m_delegate.getDataSource();
if (!(ds instanceof CachedFileDataSource)) {
return;
}
CachedFileDataSource cfds = (CachedFileDataSource)ds;
File file = cfds.getFile();
try {
file.delete();
} catch (Throwable t) {
file = null;
}
}
}